package structure.arraylist;

import java.util.Arrays;

/**
 * 线性表的顺序存储结构 顺序表
 */
public class ArrayList {
    public static final int MAXSIZE = 20; // 存储空间初始化最大值

    private int[] data; // 数组存储数据元素

    private int length; // 线性表当前长度

    // 构造函数  空构造
    public ArrayList() {
        this.data = new int[MAXSIZE]; // 初始化数组
    }

    // 带参数的构造函数  可以自定义线性表的存储空间大小
    public ArrayList(int size) {
        this.data = new int[size];
    }

    // 新增元素
    public Boolean add(int elem) {
        // 扩容
        if(this.length == MAXSIZE) {
            this.data = Arrays.copyOf(this.data, MAXSIZE * 2);
        }
        this.data[this.length++] = elem;
        return true;
    }

    // 删除元素
    public Boolean del(int elem) {
        int index = -1;
        for(int i = 0; i < this.length; i++) {
            if(this.data[i] == elem) {
                index = i;
            }
        }
        if(index == -1) {
            return false;
        }
        for(int i = index; i < this.length - 1; i++) {
            this.data[i] = this.data[i + 1];
        }
        this.length--;
        return true;
    }

    // 获取 index 位置的元素
    public int get(int index) {
        if(index < 0 || index >= this.length) {
            return -1;
        }
        return this.data[index];
    }

    // 获取元素的对应位置 index
    public int indexOf(int elem) {
        for(int i = 0; i < this.length; i++) {
            if(elem == this.data[i]) {
                return i;
            }
        }
        return -1;
    }

    // 打印线性表
    public void print() {
        for(int i = 0; i < this.length; i++) {
            System.out.print(this.data[i] + " ");
        }
    }

    // 修改 index 位置的元素为 elem
    public Boolean update(int index, int elem) {
        if(index < 0 || index >= this.length) {
            return false;
        }
        this.data[index] = elem;
        return true;
    }

    // 判断 elem 是否在线性表中
    public Boolean contains(int elem) {
        for(int i = 0; i < this.length; i++) {
            if(this.data[i] == elem) {
                return true;
            }
        }
        return false;
    }

    // 判断线性表是否已满
    public Boolean isFull() {
        return this.length == MAXSIZE ?true : false;
    }

    // 获取线性表的长度
    public int size() {
        return this.length;
    }

    // 清空顺序表
    public void clear() {
        // 如果顺序表中存储的是：引用、String，需要遍历表挨个置空
//        for(int i = 0; i < this.length; i++) {
//            this.data[i] = null;
//        }
        this.length = 0;
    }
}
